#ifndef PARAL_PY_AST_H
#define PARAL_PY_AST_H

#include"paral_py.h"
#include"input_paral_fun_MR.h"

// 规定节点的类型
struct ast_tree_node{
    // 节点类型
    int paral_py_token_type;
    // 语元
    std::string token_str;

    // 左右子树的根
    struct ast_tree_node* left;
    struct ast_tree_node* right;
};

// 上下文
struct ast_tree_construct_context{
    // 当前要转换的表达式
    std::vector<struct paral_py_tok_basic_info> expression;

    // 当前代码是不是result相关的
    bool related_to_result_assign;

    // 当前表达式遍历的位置
    int expression_index;

    // 语法树的根部
    struct ast_tree_node* tree_root;

    // 用一个变量记录保存之后的结果
    std::string trans_result_str;
};


void init_ast_tree_construct_context(struct ast_tree_construct_context* ast_ctx, std::vector<struct paral_py_tok_basic_info> expression);

// 获取一个token
struct paral_py_tok_basic_info get_next_tok_basic_info(struct ast_tree_construct_context* ast_ctx);

// 获取当前语元
struct paral_py_tok_basic_info get_current_tok_basic_info(struct ast_tree_construct_context* ast_ctx);

void ast_tree_construct_prepare(struct ast_tree_construct_context* ast_ctx);

// 使用一个主函数进入语法树的构建
void ast_tree_construct(struct ast_tree_construct_context* ast_ctx);

// 处理最基本的语元
// primary
struct ast_tree_node* parse_primary_element(struct ast_tree_construct_context* ast_ctx);



// 处理变量
struct ast_tree_node* parse_var_element(struct ast_tree_construct_context* ast_ctx);

// 处理表达式
// primary op
struct ast_tree_node* parse_express_element(struct ast_tree_construct_context* ast_ctx);

// 处理二元运算符
// op primary
// 要传入一个优先级，变量，等号，其他操作符的优先级分别是0，1，2，eof的优先级是-1
struct ast_tree_node* parse_op_element(struct ast_tree_construct_context* ast_ctx, ast_tree_node* LHS, int last_prinp);

// 处理括号表达式
// (express)
struct ast_tree_node* parse_paren_element(struct ast_tree_construct_context* ast_ctx);

// 获取指针所在元素的优先级
int prinp_of_cur_token(struct ast_tree_construct_context* ast_ctx);

// 打印语法树
void print_ast_tree(struct ast_tree_node* root);

// 将一个语法树转化为一个字符串，这是一个递归调用的函数
std::string trans_ast_to_str(struct ast_tree_node* root);


#endif